;功能：安装中断例程，实现loop指令的功能
;	  在屏幕中间显示80个“！”（实验13，262页）
;方法：
;   中断过程：int n引发中断——>取得中断类型码n
;   ——>标志寄存器压栈，TF、IF设置为0——>CS、IP入栈
;   ——>依据中断向量表修改CS、IP，(IP)=(n*4)，(CS)=(n*4+2)
;   ——>执行中断处理程序，iret指令恢复IP、CS及标志寄存器
;   std指令，将标志寄存器的df位置1		rep、movsb串传送指令
; 	offset伪指令计算偏移地址			int、iret指令
; 	jcxz指令		bp寄存器
assume cs:code

code segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset loopdef
	mov ax,0
	mov es,ax
	mov di,200h

	cld
	;将loopdef处中断处理程序的机器代码复制至0000:200
	;中断向量表，内存0000：0000到0000：03FF
	;0000：0200至0000：02FF的空间对应的中断向量表一般是空的
	mov cx,offset loopdefend-loopdef
	rep movsb

	;设置中断向量
	;将存放中断处理程序的段地址与偏移地址送入中断向量表7ch号表项
	mov ax,0
	mov ds,ax
	;mov ax,[idata]被编译器当作指令mov ax,idata常数误处理
	;需在偏移地址前显式指明ds寄存器
	mov word ptr ds:[7ch*4],200h
	mov word ptr ds:[7ch*4+2],0

	mov ax,4c00h
	int 21h

loopdef:
	dec cx
	jcxz loopbreak
	push bp
	mov bp,sp
	add [bp+2],bx
	pop bp
loopbreak:
	iret
loopdefend:
	nop

code ends
end start